const path = require('path');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');

const isProduction = process.env.NODE_ENV === 'production';
module.exports = {
    mode: isProduction ? 'production' : 'development',
    entry: {
        'extensions': path.resolve(__dirname, 'sphinx/_static/assets/js/extensions/device/device-plugin.js'), // 以 JS 文件为入口
        // vendor: ['lodash'], // 单独打包第三方库，未用到暂时注释掉
    },
    output: {
        path: path.resolve(__dirname, 'sphinx/_static/extensions/js'), // 输出目录
        filename: '[name].bundle.min.js',
        publicPath: '/_static/extensions/js/'  // 匹配部署路径
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env'],
                        compact: !isProduction,  // 开发模式下禁用Babel压缩
                    }
                }
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin({
            cleanOnceBeforeBuildPatterns: [
                path.join(__dirname, 'sphinx/_static/extensions/js/*')
            ]
        })
    ],
    optimization: {
        minimize: isProduction, // 仅在生产模式压缩
        splitChunks: {
            chunks: 'all'
        },
        minimizer: isProduction ? [ // 生产模式下的压缩配置
            new TerserPlugin({
                terserOptions: {
                    mangle: isProduction ? {  // 仅在生产模式启用混淆
                        toplevel: true,        // 混淆顶级作用域变量
                        keep_fnames: false,    // 不保留函数名
                        keep_classnames: false,// 不保留类名
                        properties: {         // 混淆属性名
                            regex: /^_/,        // 以 _ 开头的属性不混淆
                            reserved: [         // 保留特定属性名
                                'reservedProp'
                            ]
                        }
                    } : false,              // 开发模式完全禁用混淆,
                    compress: {
                        drop_console: isProduction, // 生产模式移除 console
                        pure_funcs: isProduction? ['console.log', 'console.debug']: [], // 移除特定的函数调用
                    },
                    format: {
                        beautify: !isProduction, // 开发模式美化输出
                        indent_level: 2,          // 缩进级别
                        comments: !isProduction // 生产模式移除注释
                    }
                },
                extractComments: false
            })
        ] : []
    },
    stats: 'errors-warnings', // 只显示错误和警告信息
    devtool: isProduction ? 'source-map' : 'eval-cheap-module-source-map'
};